home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
cmprss.exe
/
DPRESS.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-26
|
1KB
|
68 lines
#include <string.h>
#include "decpress.cls"
#include "type.h"
int cpifstream::decompress(uchar *inbuff, uint inbuff_len, uchar *outbuff)
{
uint ctrl_bits;
uint ctrl_mask=0;
uchar *inbuff_idx=inbuff;
uchar *outbuff_idx=outbuff;
uchar *inbuff_end=inbuff+inbuff_len;
uint cmd;
uint cnt;
uint ofs;
uint len;
while (inbuff_idx < inbuff_end)
{
if ((ctrl_mask>>=1)==0)
{
ctrl_bits=*(uint*)inbuff_idx;
inbuff_idx+=2;
ctrl_mask=0x8000;
}
if ((ctrl_bits & ctrl_mask)==0)
{
*outbuff_idx++=*inbuff_idx++;
continue;
}
cmd=(*inbuff_idx>>4) & 0x0F;
cnt=*inbuff_idx++ & 0x0F;
switch(cmd)
{
case 0:
cnt+=3;
memset(outbuff_idx,*inbuff_idx++,cnt);
outbuff_idx+=cnt;
break;
case 1:
cnt+=(*inbuff_idx++<<4);
cnt+=19;
memset(outbuff_idx,*inbuff_idx++,cnt);
outbuff_idx+=cnt;
break;
case 2:
ofs=cnt+3;
ofs+=(*inbuff_idx++<<4);
cnt=*inbuff_idx++;
cnt+=16;
memcpy(outbuff_idx, outbuff_idx-ofs, cnt);
outbuff_idx+=cnt;
break;
default:
ofs=cnt+3;
ofs+=(*inbuff_idx++<<4);
memcpy(outbuff_idx,outbuff_idx-ofs,cmd);
outbuff_idx+=cmd;
break;
}
}
return outbuff_idx-outbuff;
}